// package com.android.baseconfig.base;
//
// import android.support.annotation.NonNull;
// import android.util.Log;
//
// import java.util.ArrayList;
// import java.util.Collection;
// import java.util.Iterator;
// import java.util.List;
// import java.util.concurrent.ConcurrentHashMap;
//
// import rx.Observable;
// import rx.Subscription;
// import rx.android.schedulers.AndroidSchedulers;
// import rx.functions.Action1;
// import rx.subjects.PublishSubject;
// import rx.subjects.Subject;
//
// /*
//  * -----------------------------------------------------------------
//  * Copyright © 2016年 clife. All rights reserved.
//  * Shenzhen H&T Intelligent Control Co.,Ltd.
//  * -----------------------------------------------------------------
//  * File: RxBus.java
//  * Create: 2016/6/20 20:26
//  * Author: uuxia
//  */
// public class RxBus {
//     private static RxBus instance;
//     @SuppressWarnings("rawtypes")
//     private ConcurrentHashMap<Object, List<Subject>> subjectMapper = new ConcurrentHashMap<Object, List<Subject>>();
//
//     private ConcurrentHashMap<Object, ConcurrentHashMap<Object, Observable<?>>> subcriber = new ConcurrentHashMap<Object, ConcurrentHashMap<Object, Observable<?>>>();
//
//     private ConcurrentHashMap<Object, List<Subscription>> subscriptionMapper = new ConcurrentHashMap<Object, List<Subscription>>();
//
//     private RxBus() {
//     }
//
//     public static synchronized RxBus $1() {
//         if (null == instance) {
//             instance = new RxBus();
//         }
//         return instance;
//     }
//
//     public static RxBus $() {
//         return getInstance();
//     }
//
//     public static RxBus getInstance() {
//         if (null == instance) {
//             synchronized (RxBus.class) {
//                 if (instance == null) {
//                     instance = new RxBus();
//                 }
//             }
//         }
//         return instance;
//     }
//
//     @SuppressWarnings("rawtypes")
//     public static boolean isEmpty(Collection<Subject> collection) {
//         return null == collection || collection.isEmpty();
//     }
//
//     /**
//      * 订阅事件源
//      *
//      * @param mObservable
//      * @param mAction1
//      * @return
//      */
//     public RxBus OnEvent(Observable<?> mObservable, Action1<Object> mAction1) {
//         mObservable.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, new Action1<Throwable>() {
//             @Override
//             public void call(Throwable throwable) {
//                 throwable.printStackTrace();
//             }
//         });
//         return $();
//     }
//
//     /**
//      * 注册tag事件源
//      * 建议不要使用该方法
//      *
//      * @param tag
//      * @return
//      */
//     @SuppressWarnings({"rawtypes"})
//     public <T> Observable<T> register(@NonNull Object tag) {
//         List<Subject> subjectList = subjectMapper.get(tag);
//         if (null == subjectList) {
//             subjectList = new ArrayList<Subject>();
//             subjectMapper.put(tag, subjectList);
//         }
//         Subject<T, T> subject;
//         subjectList.add(subject = PublishSubject.create());
//         //Logc.d("uuok.register" + tag + "  size:" + subjectList.size());
//         return subject;
//     }
//
//     /**
//      * 注册tag事件源
//      *
//      * @param tag
//      * @param mAction1
//      * @param <T>
//      * @return
//      */
//     @SuppressWarnings({"rawtypes"})
//     public <T> Observable<T> register(@NonNull Object tag, @NonNull Action1<T> mAction1) {
//         List<Subject> subjectList = subjectMapper.get(tag);
//         if (null == subjectList) {
//             subjectList = new ArrayList<Subject>();
//             subjectMapper.put(tag, subjectList);
//         }
//         Subject<T, T> subject;
//         subjectList.add(subject = PublishSubject.create());
//         Log.d("RxBus","uuok.register" + tag + "  size:" + subjectList.size());
//         subject.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, new Action1<Throwable>() {
//             @Override
//             public void call(Throwable throwable) {
//                 throwable.printStackTrace();
//             }
//         });
//         return subject;
//     }
//
//     /**
//      * 注册tag事件源,并指定class
//      *
//      * @param tag
//      * @param mAction1
//      * @param clasz
//      * @param <T>
//      * @return
//      */
//     public <T> Observable<T> register(@NonNull Object tag, @NonNull Action1<T> mAction1, Class clasz) {
//         Log.d("RxBus","uuu %% " + this.getClass().toString());
//         List<Subject> subjectList = subjectMapper.get(tag);
//         if (null == subjectList) {
//             subjectList = new ArrayList<Subject>();
//             subjectMapper.put(tag, subjectList);
//         }
//         Subject<T, T> subject;
//         subjectList.add(subject = PublishSubject.create());
//         //Logc.d("uuok.register" + tag + "  size:" + subjectList.size());
// //        subject.observeOn(AndroidSchedulers.mainThread()).subscribe(mAction1, (e) -> e.printStackTrace());
//         Subscription sub = subject.observeOn(AndroidSchedulers.mainThread())
//                 .subscribe(mAction1, new Action1<Throwable>() {
//                     @Override
//                     public void call(Throwable throwable) {
//                         throwable.printStackTrace();
//                     }
//                 });
//         List<Subscription> subList = subscriptionMapper.get(clasz);
//         if (null == subList) {
//             subList = new ArrayList<>();
//         }
//         subList.add(sub);
//         subscriptionMapper.put(clasz, subList);
//         ConcurrentHashMap<Object, Observable<?>> subMap = subcriber.get(clasz);
//         if (subMap == null) {
//             subMap = new ConcurrentHashMap<Object, Observable<?>>();
//         }
//         subMap.put(tag, subject);
//         subcriber.put(clasz, subMap);
//         return subject;
//     }
//
//     public void clear(Class clazz) {
//         unsubscribe(clazz);
//         ConcurrentHashMap<Object, Observable<?>> sub = subcriber.get(clazz);
//         if (sub != null) {
//             Iterator<Object> it = sub.keySet().iterator();
//             while (it.hasNext()) {
//                 Object tag = it.next();
//                 if (tag != null) {
//                     Observable<?> value = sub.get(tag);
//                     if (value != null) {
//                         unregister(tag, value);
//                     }
//                 }
//             }
//         }
//     }
//
//     private void unsubscribe(Class clazz) {
//         List<Subscription> sub = subscriptionMapper.remove(clazz);
//         if (sub != null && !sub.isEmpty()) {
//             Iterator<Subscription> it = sub.iterator();
//             while (it.hasNext()) {
//                 Subscription subscriop = it.next();
//                 subscriop.unsubscribe();
//                 it.remove();
//             }
//         }
//     }
//
//     /**
//      * 删除class里面的所以事件，前提是注册的时候指定了class
//      *
//      * @param clazz
//      */
//     public void unregister(@NonNull Class clazz) {
//         clear(clazz);
//     }
//
//     /**
//      * 此方法是删除tag对应的整个事件，其他地方注册的该事件也一并统统删除，操作此方法要慎重考虑
//      *
//      * @param tag
//      */
//     @SuppressWarnings("rawtypes")
//     public void unregister(@NonNull Object tag) {
//         List<Subject> subjects = subjectMapper.get(tag);
//         if (null != subjects) {
//             subjectMapper.remove(tag);
//         }
//     }
//
//     /**
//      * 删除tag对应事件的指定监听者(observable),而不删除tag事件以及其他监听者
//      *
//      * @param tag
//      * @param observable
//      * @return
//      */
//     @SuppressWarnings("rawtypes")
//     public RxBus unregister(@NonNull Object tag,
//                             @NonNull Observable<?> observable) {
//         List<Subject> subjects = subjectMapper.get(tag);
//         if (null != subjects) {
//             subjects.remove(observable);
//             if (isEmpty(subjects)) {
//                 subjectMapper.remove(tag);
//                 //Logc.d("uuok.unregister" + tag + "  size:" + subjects.size());
//             }
//         }
//         return $();
//     }
//
//     public void post(@NonNull Object content) {
//         post(content.getClass().getName(), content);
//     }
//
//     /**
//      * 触发事件\
//      *
//      * @param content
//      */
//     @SuppressWarnings({"unchecked", "rawtypes"})
//     public void post(@NonNull Object tag, @NonNull Object content) {
//         Log.d("RxBus","post" + "eventName: " + tag);
//         List<Subject> subjectList = subjectMapper.get(tag);
//         if (!isEmpty(subjectList)) {
//
// //            Iterator<Subject> it = subjectList.iterator();
// //            while (it.hasNext()){
// //                Subject subject = it.next();
// //                if (subject != null){
// //                    subject.onNext(content);
// //                    Logc.d("eventName: " + tag + " subject:" + subject.hasObservers());
// //                }
// //            }
//             for (int i = 0; i < subjectList.size(); i++) {
//                 Subject subject = subjectList.get(i);
//                 if (subject != null) {
//                     subject.onNext(content);
//                     Log.d("RxBus","eventName: " + tag + " subject:" + subject.hasObservers());
//                 }
//             }
//
//         }
//     }
// }
